import { defineStore } from 'pinia'
import { ref } from 'vue'
import router from '@/router'

interface User {
  username: string
  email: string
  id : number
  password: string
  phone: string | null
  salt: string
  avatar: string | null
  status: number
  createTime: string
  updateTime: string
}

// 定义pinia的auth相关的共享变量，指定暴露的名称是useAuthStore
// 也就是外边的组件如果想要使用这个pinia中的数据
// 先要const authStore = useAuthStore() && import { useAuthStore } from '@/store/auth'
// 然后authStore.xxx就可以使用了
export const useAuthStore = defineStore('auth', () => {
  // 定义token变量，响应式的，类型是string | null, 默认值是localStorage.getItem('token')
  const token = ref<string | null>(localStorage.getItem('token'))
  // 定义user变量，响应式的，类型是User | null, 默认值是null
  const user = ref<User | null>(null)
  // 定义isAuthenticated变量，响应式的，类型是boolean, 默认值是!!token.value
  // 没有token值，isAuthenticated为false
  const isAuthenticated = ref<boolean>(!!token.value)

  function setAuth(value) {
    isAuthenticated.value = value
  }

  // login的时候触发
  // 定义方法 -> 设置token
  const setToken = (newToken: string) => {
    // 更新token值
    token.value = newToken
    // 写入本地存储
    localStorage.setItem('token', newToken)
    // 更新isAuthenticated的值
    setAuth(true)
  }

  // login的时候触发
  // 定义方法 -> 设置用户信息
  const setUser = (newUser: User) => {
    // 更新user值
    user.value = newUser
  }

  // 定义方法 -> 登出
  // 各种清空操作，然后重定向到login
  const logout = () => {
    // 清空token值
    token.value = null
    // 清空user值
    user.value = null
    // 删除本地存储的token
    localStorage.removeItem('token')
    // 更新isAuthenticated的值
    setAuth(false)
    // 跳转到登录页面
    router.push('/login')
  }

  // 暴露变量和方法
  return {
    token,
    user,
    isAuthenticated,
    setToken,
    setUser,
    logout
  }
})
